La base de tous les widgets montrés ici est une boite verticale, qui est elle-même un enfant de la fenêtre. Les widgets enfants ne sont pas affichés de façon homogène et il n'y a pas d'espace additionnel (autre que l'espace standard). Il y a six boites horizontales dans la boite verticale, définie par la fonction makeBox
. En outre, il y a deux labels dans la boite verticale ainsi que deux séparateurs. Le dernier widget est le bouton Quit dont le signal onClicked
est connecté à la fonction mainQuit
.
Les séparateurs sont créés avec hSeparatorNew
et ils sont espacés avec boxPackStart
avec un espacement de dix pixels. Les labels sont créés avec labelNew
qui prend comme argument Maybe String
et leur positionnement est défini avec miscSetAlignment
pour être justifié en haut à gauche.
La fonction makeBox :: Bool -> Int -> Packing -> Int -> IO HBox
montre comment les widgets Gtk2Hs s'adaptent au système de types de Haskell. Packing
est juste un type comme Int
et Bool
et IO HBox
est juste comme IO String
dans La fonction crée cinq boutons, les labellise avec le texte approprié et les empilent dans une boite horizontale. La fonction est alors utilisée dans le programme principal pour créer l'empaquetage de la manière souhaitée.
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
vbox <- vBoxNew False 0
set window [containerBorderWidth := 10,
windowTitle := "Packing Demonstration",
containerChild := vbox]
label1 <- labelNew (Just "hBoxNew False 0")
miscSetAlignment label1 0 0
boxPackStart vbox label1 PackNatural 0
box1 <- makeBox False 0 PackNatural 0
boxPackStart vbox box1 PackNatural 0
box2 <- makeBox False 0 PackRepel 0
boxPackStart vbox box2 PackNatural 0
box3 <- makeBox False 0 PackGrow 0
boxPackStart vbox box3 PackNatural 0
sep1 <- hSeparatorNew
boxPackStart vbox sep1 PackNatural 10
label2 <- labelNew (Just "hBoxNew True 0")
miscSetAlignment label2 0 0
boxPackStart vbox label2 PackNatural 0
box4 <- makeBox True 0 PackNatural 0
boxPackStart vbox box4 PackNatural 0
box5 <- makeBox True 0 PackRepel 0
boxPackStart vbox box5 PackNatural 0
box6 <- makeBox False 0 PackGrow 0
boxPackStart vbox box6 PackNatural 0
sep <- hSeparatorNew
boxPackStart vbox sep PackNatural 10
quitbox <- hBoxNew False 0
boxPackStart vbox quitbox PackNatural 0
quitbutton <- buttonNewWithLabel "Quit"
boxPackStart quitbox quitbutton PackRepel 0
onClicked quitbutton mainQuit
onDestroy window mainQuit
widgetShowAll window
mainGUI
makeBox :: Bool -> Int -> Packing -> Int -> IO HBox
makeBox homogeneous spacing packing padding = do
box <- hBoxNew homogeneous spacing
button1 <- buttonNewWithLabel "boxPackStart"
boxPackStart box button1 packing padding
button2 <- buttonNewWithLabel "box"
boxPackStart box button2 packing padding
button3 <- buttonNewWithLabel "button"
boxPackStart box button3 packing padding
button4 <- case packing of
PackNatural -> buttonNewWithLabel "PackNatural"
PackRepel -> buttonNewWithLabel "PackRepel"
PackGrow -> buttonNewWithLabel "PackGrow"
boxPackStart box button4 packing padding
button5 <- buttonNewWithLabel (show padding)
boxPackStart box button5 packing padding
return box
L'image suivante montre les effets du redimensionnement horizontal de la fenêtre. Dans le premier groupe avec homogeneous définis à False, le redimensionnement horizontal laisse la première ligne de boutons telle qu'elle est, les espaces de la seconde uniformes et élargit les boutons de la troisième ligne. Dans le deuxième groupe, les boutons sont réglés pour être empaquetés de façon homogène et les deux premières lignes se ressemblent. Redimensionner la fenêtre verticalement ajoute seulement un espace additionnel à la fin, car la boite verticale a été initialisée à False.